#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <jsoncpp/json/json.h>

std::string serialize()
{
    //1.将需要进行序列化的数据，存储在Json::value 对象中
    Json::Value root;
    root["姓名"] = "小明";
    root["年龄"] = 18;
    root["成绩"].append(88);
    root["成绩"].append(85.5);
    root["成绩"].append(89);
    //2.实例化一个 StreamwriterBuilder 工厂类对象
    Json::StreamWriterBuilder swb;
    //3.通过 StreamwriterBuilder 工厂类对象生产一个StreamWriter对象
    Json::StreamWriter *sw = swb.newStreamWriter();
    //4.使用StreamWriter对象，对Json::value中存储的数据进行序列化
    std::stringstream ss;
    int ret = sw->write(root,&ss);
    if(ret != 0)
    {
        std::cout<<"json serialize failed!!/n";
        return "";
    }
    else
    {
        std::cout<<ss.str()<<std::endl;
    }
    delete sw;
    return ss.str();
}

void unserialize(const std::string &str)
{
    //1.实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    //2.使用CharReaderBuilder工厂类对象生产一个CharReader对象
    Json::CharReader *cr = crb.newCharReader();
    //3.定义一个Json::Value对象存储反序列化后的数据
    Json::Value root;
    std::string err;
    //4.使用CharReader对象进行json格式字符串str的反序列化
    //parse(char* start,char* end,json::value *val,string *err)
    bool ret = cr->parse(str.c_str(),str.c_str()+str.size(),&root,&err);
    if(ret == false) 
    {
        std::cout<<"json unserialize failed: "<<err<<std::endl;
        return ;
    }
    //5.逐个访问json：value中的数据
    std::cout<<"姓名： "<<root["姓名"].asString()<<std::endl;
    std::cout<<"年龄： "<<root["年龄"].asInt()<<std::endl;
    int sz = root["成绩"].size();
    for(int i=0;i<sz;i++)
    {
        std::cout<<"成绩： "<<root["成绩"][i].asFloat()<<std::endl;

    }
    delete cr;
}

int main()
{
    std::string str = serialize();

    unserialize(str);   
    return 0;
}